package complexes;

public interface Complexe
{
	// Accesseurs, à réimplémenté obligatoirement dans les implémentations.
	public double getRe();
	public double getIm();
	public double getModule();
	public Angle getArgument();
	
	//Fabriques, pour instancier l'implémentation de Complexe la plus appropriée
	public static Complexe creer(double re, double im)
	{
		return new AlgeComplexe(re, im);
	}
	public static Complexe creer(double rho, Angle theta)
	{
		return new ExpoComplexe(rho, theta);
	}
	
	//Services, lois et fonctions associées aux complèxes.
	public default Complexe somme(Complexe c)
	{
		return creer(this.getRe() + c.getRe(), this.getIm() + c.getIm());
	}
	
	public default Complexe produit(Complexe c)
	{
		return creer(this.getModule() * c.getModule(), this.getArgument().somme(c.getArgument()));
	}
	
	public default Complexe racineCarree()
	{
		return creer(Math.sqrt(this.getModule()), this.getArgument().facteur(1/2));
	}
	
	public default Complexe inverse()
	{
		double a = this.getRe();
		double b = this.getIm();
		
		return creer(a /(a*a + b*b), -b/(a*a + b*b));
	}
}
